home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_400
/
431_01
/
rclient.c
< prev
next >
Wrap
Text File
|
1995-01-06
|
27KB
|
1,056 lines
/*
this program will have two simple functions.
CLIENT
1. check IFS request. if not for my drives, pass on
2. packet the request for xfer
3. xfer packet. wait for return
4. unpacket the result
5. return
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <dir.h>
#include <dos.h>
#include "ifs.h"
#include "comio.h"
#include "crc32.h"
#include "svr0.h"
#include "ifs0.h"
#include "rifs.h"
#include "myalloc.h"
#include "rclient.h"
#include "local.h"
unsigned _stklen=512;
LOCAL BYTE *SDA; /* swappable data area */
LOCAL WORD SDA_maxsize; /* size of SDA */
LOCAL WORD SDA_minsize;
LOCAL BYTE *CDS_base; /* current directory structure */
LOCAL WORD CDS_size; /* # of bytes per entry */
LOCAL WORD CDS_ct; /* number of entries */
/*************************************************************************
*************************************************************************
CLIENT
*************************************************************************
*************************************************************************/
/*
these are the sda members about which i am concerned
(set on entry)
*/
LOCAL WORD *SDA_CURR_PSP;
LOCAL DTA **SDA_CURR_DTA;
LOCAL char *SDA_FN1;
LOCAL char *SDA_FN2;
LOCAL SDB *SDA_SDB;
LOCAL CDS *SDA_CURR_CDS;
LOCAL DIR *SDA_DIR_ENTRY;
LOCAL BYTE *SDA_SRCH_ATTR;
LOCAL BYTE *SDA_OPEN_MODE;
LOCAL CDS **SDA_DRIVE_CDSPTR;
LOCAL SFT **SDA_SFT;
LOCAL WORD *SDA_EXTOPEN_ACTION;
LOCAL WORD *SDA_EXTOPEN_ATTR;
LOCAL WORD *SDA_EXTOPEN_MODE;
LOCAL CDS *CDS_init; /* initial CDS structure */
LOCAL XMITBUF *iobuf1, /* current / last used buffers */
*iobuf2,
*iobufptr; /* current buffer */
LOCAL WORD iobufptr_datasize; /* i/o data buffer size */
LOCAL WORD iobufptr_rwdatasize; /* largest block to send for read/write
must be no bigger than datasize-8 */
LOCAL BYTE remote; /* remote drive map */
LOCAL BYTE local; /* local drive */
/*
drive translation table
0 = not mapped, else 'A'..'Z' is translation
ex:
SVR_XLAT_TABLE[3] == 'C'
then local drive D is mapped to server drive C
*/
LOCAL BYTE DRIVE_XLAT_TABLE[26];
LOCAL IFS_STAT IFS_stat;
LOCAL BYTE portmapped[3];
BOOL portio(INTREGS *regs);
int Intr17(INTREGS *regs)
{
if ((regs->dx < 3) && (regs->ax < 0x300) && portmapped[regs->dx]) {
WORD oldport = regs->dx;
regs->dx=portmapped[regs->dx]-1;
portio(regs);
regs->dx=oldport;
/*
if (regs->ax)
regs->flags |= 0x40;
else
regs->flags &= ~0x40;
*/
return 1;
} else
return 0;
}
LOCAL void uninit(void)
{
ifs0_shutdown();
CommIO_shutdown();
if (CDS_init) {
memcpy(CDS_base, CDS_init, CDS_size * CDS_ct);
my_free(CDS_init);
CDS_init=0;
}
if (iobuf1) {
my_free(iobuf1);
my_free(iobuf2);
iobufptr=0;
iobufptr_datasize=0;
}
}
/*
initialize misc-> varaibles
*/
LOCAL BOOL InitClient(int intno)
{
struct REGPACK regs;
BYTE *LOL; /* list of lists */
regs.r_ax=0x5d06;
intr(0x21, ®s);
SDA=MK_FP(regs.r_ds, regs.r_si);
SDA_maxsize=regs.r_cx;
SDA_minsize=regs.r_dx;
/*
init lcl_SDA (for SERVER)
*/
regs.r_ax=0x5200;
intr(0x21, ®s);
LOL=MK_FP(regs.r_es, regs.r_bx);
CDS_base=*(void **) (LOL+0x16);
CDS_ct=*(BYTE *) (LOL + 0x21);
if (_osmajor >= 5) {
CDS_size = 0x58;
SDA_CURR_DTA = (void *) (SDA + 0x000c);
SDA_CURR_PSP = (void *) (SDA + 0x0010);
SDA_FN1 = (void *) (SDA + 0x009e);
SDA_FN2 = (void *) (SDA + 0x011e);
SDA_SDB = (void *) (SDA + 0x019e);
SDA_DIR_ENTRY = (void *) (SDA + 0x01b3);
SDA_CURR_CDS = (void *) (SDA + 0x01d3);
SDA_SRCH_ATTR = (void *) (SDA + 0x024d);
SDA_OPEN_MODE = (void *) (SDA + 0x024e);
SDA_SFT = (void *) (SDA + 0x027e);
SDA_DRIVE_CDSPTR = (void *) (SDA + 0x0282);
SDA_EXTOPEN_ACTION = (void *) (SDA + 0x02dd);
SDA_EXTOPEN_ATTR = (void *) (SDA + 0x02df);
SDA_EXTOPEN_MODE = (void *) (SDA + 0x02e1);
} else {
CDS_size = 0x51;
SDA_CURR_DTA = (void *) (SDA + 0x000c);
SDA_CURR_PSP = (void *) (SDA + 0x0010);
SDA_FN1 = (void *) (SDA + 0x0092);
SDA_FN2 = (void *) (SDA + 0x0112);
SDA_SDB = (void *) (SDA + 0x0192);
SDA_DIR_ENTRY = (void *) (SDA + 0x01a7);
SDA_CURR_CDS = (void *) (SDA + 0x01c7);
SDA_SRCH_ATTR = (void *) (SDA + 0x023a);
SDA_OPEN_MODE = (void *) (SDA + 0x023b);
SDA_SFT = (void *) (SDA + 0x0268);
SDA_DRIVE_CDSPTR = (void *) (SDA + 0x026c);
SDA_EXTOPEN_ACTION = 0; /* these do not exist in DOS 3.x */
SDA_EXTOPEN_ATTR = 0;
SDA_EXTOPEN_MODE = 0;
}
ifs0_init(intno);
CDS_init=my_malloc(CDS_size * CDS_ct);
memcpy(CDS_init, CDS_base, CDS_size * CDS_ct);
iobufptr_datasize=BLOCKSIZE;
iobufptr_rwdatasize=BLOCKSIZE-8;
iobuf1=my_malloc(iobufptr_datasize+sizeof(*iobuf1));
iobuf2=my_malloc(iobufptr_datasize+sizeof(*iobuf2));
iobufptr=iobuf1;
return 1;
}
#define COMMAND(a) {iobufptr->length=0; iobufptr->cmd=a; }
#define SPARAM(a) {strcpy(iobufptr->data+iobufptr->length, a); iobufptr->length+=strlen(a)+1; }
WORD Transmit(void);
/*
port i/o
dx = port # (0..2, 0x80..0x83)
ah = function #
al = character
*/
LOCAL BOOL portio(INTREGS *regs)
{
COMMAND(IFS_PORTOUT);
*(WORD *) iobufptr->data = regs->dx;
*(WORD *) (iobufptr->data+2) = regs->ax;
iobufptr->length = 4;
Transmit();
regs->ax=iobufptr->cmd;
return (regs->ax) ? 0xff00 : 0x0000;
}
/*
remove directory
*/
LOCAL BOOL ifs_rmdir(INTREGS *regs)
{
COMMAND(IFS_RMDIR);
SPARAM(SDA_FN1);
iobufptr->data[0]=remote;
Transmit();
regs->ax=iobufptr->cmd;
return (regs->ax) ? 0xff00 : 0x0000;
}
/*
change directory
*/
LOCAL BOOL ifs_chdir(INTREGS *regs)
{
COMMAND(IFS_CHDIR);
SPARAM(SDA_FN1);
iobufptr->data[0]=remote;
Transmit();
regs->ax=iobufptr->cmd;
return (regs->ax) ? 0xff00 : 0x0000;
}
/*
create directory
*/
LOCAL BOOL ifs_mkdir(INTREGS *regs)
{
COMMAND(IFS_MKDIR);
SPARAM(SDA_FN1);
iobufptr->data[0]=remote;
Transmit();
regs->ax=iobufptr->cmd;
return (regs->ax) ? 0xff00 : 0x0000;
}
LOCAL BOOL ifs_closefile(INTREGS *regs)
{
SFT *sft=MK_FP(regs->es, regs->di);
COMMAND(IFS_CLOSEFILE);
*(int *) iobufptr->data=sft->dir_sector;
*(unsigned *) (iobufptr->data+2) = sft->ftime;
*(unsigned *) (iobufptr->data+4) = sft->fdate;
iobufptr->length=6;
Transmit();
if (sft->handlect > 0)
sft->handlect--;
regs->ax=iobufptr->cmd;
return (regs->ax) ? 0xff00 : 0x0000;
}
LOCAL BOOL ifs_commitfile(INTREGS *regs)
{
COMMAND(IFS_COMMITFILE);
Transmit();
regs->ax=iobufptr->cmd;
return (regs->ax) ? 0xff00 : 0x0000;
}
#define NORMALIZE(a) a=MK_FP(FP_SEG(a)+(FP_OFF(a) >> 4), FP_OFF(a) & 0x0f)
LOCAL BOOL ifs_readfile(INTREGS *regs)
{
SFT *sft=MK_FP(regs->es, regs->di);
char *dst=(char *) *SDA_CURR_DTA;
WORD sz=regs->cx;
int read;
regs->cx=0;
while (sz > 0) {
int tz=min(iobufptr_rwdatasize, sz);
COMMAND(IFS_READFILE);
*(int *) iobufptr->data =sft->dir_sector;
*(long *) (iobufptr->data+2)=sft->fpos;
*(int *) (iobufptr->data+6)=tz;
iobufptr->length=8;
Transmit();
read=*(int *) iobufptr->data;
memcpy(dst, iobufptr->data+2, read);
dst += read;
NORMALIZE(dst);
sz -= read;
regs->cx += read;
regs->ax=iobufptr->cmd;
sft->fpos += read;
if ((regs->ax != 0) || (read != tz))
break;
}
return (regs->ax) ? 0xff00 : 0x0000;
}
LO